המנגנון של קוקיס מתגלה. הסבר ברור על איך הכל עובד, מה זה קוקיס ואיך לאכול את העוגיות כדי שלא יכאב בבטן או במקום אחר
קוקי זה כמו מדבקה. הדפדפן פעם ראשונה ניגש אל השרת, השרת לוקח מדבקה, כותב עליה שם=אלכס, מדביק אותה על המצח של הדפדפן ומעכשיו כל פעם שהדפדפן בא אל השרת, הוא יכול לקרוא את התוכן של המדבקה.
הדפדפן יכול להחליט לכתוב לעצמו משהו על המדבקה (כשהוא בבית והשרת לא רואה אותו) ובפעם הבאה כשייפגש עם השרת, השרת יקרא את כל התוכן החדש שיהיה כתוב שם.
הדפדפן יכול למחוק משהו מהמדבקה כשהשרת לא רואה. הוא יכול להוסיף לה משהו או לשנות בה משהו והשרת יקרא את מה שיהיה כתוב בה כשהם יפגשו שוב.
השרת לא זוכר שום דבר
הדרך (השפה) שבה הדפדפן והשרת מדברים נקראת פרוטוקול http. השפה הזאת לא נותנת אפשרות לשמור מידע על החיבור. כל פעם שדפדפן ניגש לשרת, השרת לא יודע אם זה אותו אחד שהיה כאן לפני שניה, אתמול בערב או זה אותו דפדפן מלפני חודש.
מטרתם של העוגיות היא לאפשר סוג של זיכרון. השרת ידביק על הדפדפן מדבקה - אתה משתמש מספר 1. וכל פעם שאותו דפדפן יבוא עם המדבקה, השרת יוכל לקרוא אותה ולהגיד: אאאההה, ממצב משתמש מס' 1 ?
מדבקה, כמעט
השוני היחידי ממדבקה, היא שהשרת לא יכול להדביק שום דבר על הדפדפן. אינו לו שליטה עליו. השרת יכול לבקש מהדפדפן להדביק על עצמו מדבקה. לבקש מהדפדפן ליצור לעצמו קוקי.
כדי לומר לדפדפן ליצור קוקי השרת משתמש ב-header הבא:
Set-Cookie: name=Alex
הדפדפן מקבל מהשרת את הפקודה הזאת, יוצר לעצמו מדבקה וכותב עליה name=Alex.
כל פעם שהוא יפנה אל השרת הזה מאתה, הוא יבוא אם המדבקה הזו.
יצירת קוקי
ב-php קיימת פונקציה מיוחדת להדבקת מדבקות setcookie. היא מקבלת די הרבה פרמטרים. בואו נראה איך להשתמש בה.
setcookie('name', 'Alex');
הפקודה הזו גורמת לשרת לייצר את ה-header שתואר מעלה ולשלוח אותו לדפדפן.
המדבקה שתיווצר תוצמד לכל פניה של הדפדפן אל השרת מרגע יצירתה ועד סוף העולם או מחיקת הדפדפן (הראשון מביניהם בכל אופן), אלה אם נשתמש בפרמטר השלישי של הפונקציה:
תוקפה של קוקי
setcookie('name', 'Alex', time()+3600 );
הפרמטר השלישי הוא השניה שבה תוקפו של הקוקי יפוג.
הזמן במערכות מחשב לרוב מחושב בשניות מאז נקודת התחלת ספירה כלשהי. הגיוני לחשוב שיש לספור את כמות השניות מאז שנת אפס לספירה, אבל כמות השניות שעברה ב2000 שנה האחרונות גדולה מדי, לכן החליטו להשתמש בנקודת הייחוס של הזמן בתאריך 01/01/1970 00:00:00.
למשל כמות השניות שעברה מאז תחילת 1970 עד רגע כתיבת הודעה זו היא 1305488755 שניות. הפונקציה time() מחזירה את המספרה הזה. כמות השניות שעברו מאז תחילת 1970.
הפרמטר השלישי של הפונקציה setcookie היא השנייה שבה הקוקי אמור לפוג. בשנייה הזו הדפדפן יוריד מעצמו את המדבקה. השנייה הזו היא גם יחסית לתחילת 1970, לכן מחברים לרגע הנוכחי עוד 3600 שניות וזו תהיה השנייה שתבוא בעוד שעה.
אם לא ניתן ערך לפרמטר השלישי (או ניתן את הערך 0) תוקפו של הקוקי יהיה עד סגירת חלון הדפדפן (לא הטאב, אלה הדפדפן).
תיקיה של קוקי
משום מה קוקי שנוצר בתיקיה אחת phpguide.co.il/directory/index.php לא יהיה זמין לשרת בכתובת בתיקיה אחרת phpguide.co.il/another/index.php . כנראה שהדפדפנים החליטו להתחכם ולא באים לשרת עם המדבקה כשפונים לתיקיה אחרת.
לפעמים זה טוב, כשיש לכם פורום בתיקיה phpguide.co.il/forum/ (ובאמת יש אחד כזה, תבדקו אותי). אבל לפעמים אתם רוצים שקוקי שהוגדר בתיקיה מסוימת בכל זאת יהיה נגיש בכל מקום באתר.
הפרמטר הרביעי ממלא בדיוק את הפונקציה הזו:
setcookie('name', 'Alex', time()+3600 , '/');
סלאש יחיד מסמן זמינות של קוקי בכל תיקיות האתר.
אפשר לרשום ישירות את שם התיקיה אם רוצים /forum/.
אם לא נגדיר ערך זה, הערך ברירת מחדל תהיה התיקיה שבה נמצא הסקריפט שיוצר את הקוקי.
קריאת קוקי
אחרי שיצרנו את הקוקי אפשר לקרוא אותו לתוך משתנה.
את כל הנתונים מהקוקי שהדפדפן מגיעה איתם, php שמה במערך $_COOKIE
setcookie('name', 'Alex');
if( isset($_COOKIE['name']) ) echo $_COOKIE['name'];
if( isset($_COOKIE['name']) ) echo $_COOKIE['name'];
הפעילו את הקוד ונסו לחשוב למה בטעינה הראשונה של העמוד לא הופיע בו שום דבר?
תשובה בצבע לבן:
הסיבה היא שבפעם הראשונה הדפדפן בה אל השרת בלי שום מדבקה. php לא ראתה שום נתונים כדי לשים במערך. לאחר מכן השרת ביקש לשים מדבקה ובזה הפגישה הראשונה ביניהם הסתיימה. אחרי שלחצנו f5 הדפדפן ניגש אל השרת שוב, הפעם עם תוכן במבדקה. php קראה אותו ושמה במשתנה $_COOKIE שהדפסנו.
מונה כניסות
בואו נספור כמה פעמים ביקרנו בעמוד מסוים.
קיוויתי שתוכלו לעזור לי לכתוב את הקוד.
הקוד צריך לבדוק האם כבר קיים קוקי:
אם לא, כלומר זה כניסה ראשונה של הדפדפן — ליצור קוקי חדש עם הערך 1.
אם כן, לקרוא את הערך, להגדיל אותו באחד וליצור קוקי חדש עם אותו שם, שידרוס את הקוקי הישן.
אחרי הכל להדפיס את הערך למסך עם המילים: זה הביקור ה X שלך בעמוד.
יש מצב שהתשובה תהיה בתגובות,
אבל לא קראתם את כל זה בשביל להעתיק את התשובה מהתגובות, נכון?
אבטחת קוקי
הקוקי כולו נמצא אצל הדפדפן. הוא יכול לשנות את הערך שלו, למחוק אותו, להוסיף לשם נתונים ולעשות כל שברצונו עם הקוקי שלכם. לא ממש רצוי לשמור שם נתונים סודיים, כי גם לקרוא אותו לא כל כך קשה.
אחרי שלחצתם 15 פעמים f5 במונה ספירות שלכם, כנסו ל
Firefox: Options -> Privacy Tab -> Remove individual cookies
Chrome: Options -> Under the hood -> Content settings -> All cookies and site data
Opera: Menu -> Settings -> Preferences -> Advanced tab -> Cookies -> Manage Cookies
Internet Explorer: getfirefox.com -> Firefox 4 free download
ב firefox למשל ממש קל לשנות את הערך של הקוקי.
הגדילו את מונה הכניסות שלכם ב 100 וכנסו לעמוד המונה שלכם שוב.
נו, איך?
עכשיו שנו את תוכן הקוקי שלכם למילה "hello" וכנסו שוב לעמוד המונה. קיבלתם שגיאה או תוצאה לא צפויה? לא הייתם מוכנים לערך לא מספרי בקוקי שלכם? הזהרו.
הצלחתי להעביר את המסר שעל קוקי אי אפשר לסמוך?
עכשיו החלק שבו אני אומר לכם:
תשמרו בקוקי נתונים לתווך הארוך.
נחמד לשמור את שם המשתמש והסיסמה ובקוקי:
אם הוא יחליט למחוק אותם — בסדר, יצטרך להזדהות באתר שוב.
אם הוא ינסה לשנות אותם, האתר יבדוק את השם והסיסמה, יבין שהם לא נכונים והמשתמש רק יתבאס. את השם והסיסמה של מישהו אחר הוא ממילא לא יודע.
קוקי מקום שמירה מצוין לנתונים שלא אכפת לכם אם המשתמש ינסה לשנות.
רק תעשו טובה, אל תשמרו בקוקי את שם המשתמש והסיסמה. מישהו אחר פשוט ייגש למחשב, יפתח את רשימת הקוקי, יעתיק את הנתונים וילך לבצע מעשים זדוניים.
+ נתונים רגישים לא צריכים להיות בקוקי, כיוון שקוקי יכול להיגנב על ידי פרצת הבטחה ספציפית. ובכלל בשביל נתונים רגישים והזדהות קיים מנגנון הסשנים, שאליו נגיע בפרק הבא (אחרי שתכתבו מונה כניסות כמובן =).
תגובות לכתבה:
תודה רבה אלכס, קראתי את כל המאמר, מאמר מצוין, תודה.
עכשיו יש לי שאלה אליך, נגיד ויש לי פורום,
איך בעצם אני ידע אם המשתמש מחובר או לא?
אני בד"כ מביא עוגייות, אחת - ID המשתמשים, שתיים - סיסמת המשתמש(מוצפנת).
באיזה תחליף להשתמש? תודה רבה.
התחליף הוא להשתמש בסשן, שהוא מנגנון שמירת נתונים זמניים בצידו של השרת. כרגע אין לי מדריך טוב לתת לך על זה בעברית, אבל תוכל לקרוא על זה באנגלית באתר של php.net אם תרצה.
ומה לגבי Session Hijacking ?
אספר גם על זה ואיך לכתוב נכון כדי לא לפחד מ session hijacking
תודה רבה אלכס. מתי בערך אתה תפרסם את המדריך(כלומר, מתי תכתוב אותו)?
תרשם לעשדכונים במייל ואתה תהיה הראשון לדעת על פרסומו :-)
Done :) תודה אלכס.
session hijacking זה פריצה בדפדפן
זה לא פריצה בדפדפן, זה xss שגונב לך את הקוקי.
לקרוא על זה אפשר כאן:
http://phpguide.co.il/Cross_Site_Scripting.htm
יש כמה סוגי התקפות מסוג session hijacking. יותר נכון, תת התקפות. זה לא בהכרח xss. פשוט צריך להחליף id בכל פנייה וזה בקרוב המקרים פותר את הבעיה.
לא הבנתי משהו:
אני רוצה להשתמש באתר בקוקי ולא בסשן-כדי שזה ישמר לו גם לפעמים הבאות,כמו זכור אותי.
אז אם לא להעביר שם שם וסיסמה(מוצפנת),אז איך כן לעשות את זה???
ועוד הוספה קטנה למה לא יהיה בעיית אבטחה:
אם זה מהמחשב האישי שלו-אז רק לו יש גישה לקוקי ואם יש לעוד מישהו אז זה בעייה שלו שפרצו לו למחשב ...
ואם זה ממחשב ציבורי - אז הוא יצטרך ללחוץ התנתקות בשביל לצאת מהאתר כדי שאחד אחר לא יוכל להיכנס על חשבונו,ובלחיצה על התנתקות הקוקי נמחק!
אתה יכול להשתמש גם וגם, אף אחד לא מגביל אותך.
לתווך הקצר מידע על המשתמש תשמור בסשן. בקוקי תשמור שם משתמש ושם ושם משתמש מוצפן (ראה תגובות לכתבה http://phpguide.co.il/SESSION.htm )
הנה אז אתה מסכים שבקוקי שומרים: שם משתמש וסיסמא מוצפנת?
לא. תשמור שם משתמש ושם משתמש מוצפן
ID ו ID מוצפן או כל מזהה אחר. לא צריכה להיות שם סיסמה של משתמש ואין שום סיבה שתהיה שם.
אבל אתה צריך להבין,שאם אני שומר נתונים בקוקי שהם יזהו את המשתמש.
אז זה כבר לא משנה האם זה שם וסיסמה(מוצפנת), או שזה id ומזהה אחר מוצפן.
##למקרה שלא הבנת אז: הזיהוי לאתר הוא ע"י מה שבקוקי גם לשיטתך וגם לשיטתי. רק מה לשים שם?-כבר לא ממש משנה כי אם יש לו את הקוקי הוא יתחבר בין אם יש שם שם ובין אם יש שם מספר מזהה...
http://phpguide.co.il/phplive?code=249
לא הבנתי מה באת להראות בקוד,תוכל להסביר (בקצרה)?
המדריכים שלך פשוט מעולים תודה.